小白学爬虫系列-基础-requests详解
「关注我,和我一起放下灵魂,让灵魂去搬砖。」
作者:小一
介绍:放不下灵魂的搬砖者
全文共2326字,阅读全文需9分钟
Python版本3.8.0,开发工具:Pycharm
前面已经讲过如何安装并使用 requests 进行网页内容获取。但是requests 的功能可不止这些,跟我一起来看看吧
1. 获取内容
url = 'https://movie.douban.com/top250'
response = requests.get(url)
# 打印响应结果的状态码、编码方式、cookie等内容
print(response.status_code)
print(response.encoding)
print(response.cookies)
通过requests 的 get 方法获取豆瓣电影TOP 250
的响应内容,包括状态码、编码、cookie等
运行结果如下:
418
None
<RequestsCookieJar[]>
不对啊,我要的结果呢?还有418
是个什么神仙状态码?于是机智的我赶紧 google 了一下
htcpcp1.0协议中的418的意义是:当客户端给一个茶壶发送泡咖啡的请求时,茶壶就返回一个418错误状态码,表示“我是一个茶壶”。
查完更懵了,这又是个什么神仙解释?
不管了,反正就是返回不正确。会不会是因为豆瓣对访问进行头部识别?刚好上一节也说过怎么设置头部,说搞就搞
url = 'https://movie.douban.com/top250'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
}
response = requests.get(url=url, headers=headers)
# 打印响应结果的状态码、编码方式、cookie等内容
print(response.status_code)
print(response.encoding)
print(response.cookies)
返回结果如下
200
utf-8
<RequestsCookieJar[<Cookie bid=N_uBlMrf9mM for .douban.com/>]>
呼,果然如此,看到200
不由得在心底又夸了一下自己
。
上面的访问使用最基本的 get 请求,那如果我要加访问参数
呢?
user_info = {'username': 'yiye', 'passwd': 'zhiqiu'}
response = requests.get(url=url, headers=headers, params=user_info)
什么?你说 get 请求不安全,行,那我们来试试 post 请求
user_info = {'username': 'yiye', 'passwd': 'zhiqiu'}
response = requests.post(url=url, headers=headers, data=user_info)
当有时候我们需要传递 JSON 形式的数据时,可以使用 json.dumps() 方法对数据序列化
user_info = {'username': 'yiye', 'passwd': 'xiaoyi', 'age': '18'}
response = requests.post(url=url, headers=headers, data=json.dumps(user_info))
这里解释一下什么是表单数据:
当你在登录网页时,需要你填写
用户名、密码、验证码
等信息进行提交,这些信息会被统一放在一个表格
里面,提交给服务器进行验证。
这些提交的数据称为表单数据
同样的,当我们需要上传文件时,也可以把文件放在参数中上传
upload_file = {'file': open('test.txt', 'rb')}
response = requests.post(url=url, files=upload_file)
2. cookie配置
咦,小一哥,你怎么又提到了 cookie ,上节不是说过了吗?
对,没错,因为 cookie 对于需要登录的网站来说,太重要了!
当你成功登录一个网站的时候,你可以将本次登录的 cookie 保存在本地
,等你下一次需要再次登录的时候,直接读取你本地的 cookie 内容
,而不用再次输入用户名、密码等,是不是很方便?
# 获取浏览器cookie
b_cookies = response.cookies
# 将cookie 保存在本地
cookies = dict()
for i in b_cookies:
cookies[i['name']] = i['value']
with open("file_path", 'wb') as f:
f.write(pickle.dumps(cookies))
# 第二次访问直接通过cookie 访问
response = requests.get(url, cookies=cookies)
print(response.status_code)
print(response.encoding)
3. 会话(session)
既然提到了cookie ,那 session 也不能落下吧。
这里先普及一下什么是cookie,什么是session?
答:“
cookie通过在客户端
记录信息确定用户身份,session通过在服务器端
记录信息确定用户身份”。总之就是你访问一次人家就认识你了,第二次去的时候可能直接就给你开门了,而不需要再登陆。
cookie以文本格式
存储在浏览器
上,存储量有限;而会话存储在
服务端
,可以无限量存储多个变量并且比cookie更安全
也就是说,我们同样可以通过 session 会话去访问部分网页,不同的是,这些网页是通过服务器端 session 信息验证用户,而不是通过本地 cookie。
# 1. 获取session
session = requests.Session()
# 2. 传入本地cookies
content = session.get(url, cookies=cookie).text
print(content)
4. 超时配置
为防止服务器响应缓慢,导致客户端处理异常。requests请求通常利用 timeout 变量来配置最大请求时间
连接超时一般设为比 3 的倍数略大的一个数值,因为 TCP 数据包重传窗口的默认大小是 3
Timeout 类型:
连接超时
:客户端实现到远端服务器端口的连接时 request 所等待的时间。
连接超时一般设为比 3 的倍数略大的一个数值,因为 TCP 数据包重传窗口的默认大小是 3。
读取超时
:客户端已经连接上服务器并且发送了request后,客户端等待服务器发送请求的时间。
一般指的是服务器发送第一个字节之前的时间。
timeout 设置单一的值,将会用作 connect
和 read
二者的 timeout。
requests.get(url=url, timeout=5)
如果要分别制定,就需要传入一个元组
。
requests.get(url=url, timeout=(5, 10))
5. SSL 证书验证
现在随处可见 https 开头的网站,Requests 可以为 HTTPS 请求验证 SSL 证书
。
要想检查某个主机的SSL证书,你可以使用verify 参数
。默认是True
,表示需要验证
# 设置 verify 参数为 False,可以跳过证书验证
response = requests.get('https://输入你的网址', verify=False)
print response.text
6. 代理
“小一哥,那什么时候会用到代理呢?”
“当然是当你要访问的网站对访问 IP 有限制的时候”
通过对任意请求方法提供 proxies 参数配置单个请求。
proxies = {
"http": "代理主机ip及端口号",
"https": "代理主机ip及端口号",
}
# 通过requests 方法设置代理访问
response = requests.get("http://www.baidu.com/", proxies = proxies)
Python系列
Python系列会持续更新,从基础入门到进阶技巧,从编程语法到项目实战。若您在阅读的过程中发现文章存在错误,烦请指正,非常感谢;若您在阅读的过程中能有所收获,欢迎一起分享交流。
如果你也想和我一起学习Python,关注我吧!
学习Python,我们不只是说说而已
不知道你们有没有发现,我改名字了!
为什么改成『小一』呢,我还想了挺久的,一直没想好。
后来想了想,我现在刚迈出自己的第一步,从0到1,也正好处于第一阶段,干脆就叫小一算了。
当然,小千小万也不是不可以?
End
限时领取,100G+数据分析干货资料免费领小白学爬虫系列-基础-两种爬虫实现方式
小白学爬虫系列-基础-准备工作
Python入门进阶汇总(全)
Python入门基础教程-补充
Python入门基础汇总